<?php

namespace app\common;

use Predis\Client;

class RedisClient
{
    private $client;

    public function __construct()
    {
        $this->connect();
    }

    private function connect()
    {
        $config = config('database.redis');

        $this->client = new Client($config);
    }

    public function getClient()
    {
        return $this->client;
    }

    // 事务
    public function multi()
    {
        return $this->client->multi();
    }

    // 执行事务
    public function exec()
    {
        return $this->client->exec();
    }

    // 检查键是否存在   
    public function exists($key)
    {
        return $this->client->exists($key);
    }

    // 设置键值
    public function set($key, $value)
    {
        return $this->client->set($key, $value);
    }

    // 获取键值
    public function get($key)
    {
        return $this->client->get($key);
    }

    // 删除键值
    public function delete($key)
    {
        return $this->client->del($key);
    }

    // 增加计数器
    public function incr($key)
    {
        return $this->client->incr($key);
    }

    // 存储哈希表
    public function hSet($key, $field, $value)
    {
        return $this->client->hSet($key, $field, $value);
    }

    // 获取哈希表中的字段值
    public function hGet($key, $field)
    {
        return $this->client->hGet($key, $field);
    }

    // 获取哈希表中的所有字段值
    public function hGetAll($key)
    {
        return $this->client->hGetAll($key);
    }

    public function hMSet($key, $fields)
    {
        return $this->client->hMSet($key, $fields);
    }
    public function hMGet($key, $fields)
    {
        return $this->client->hMGet($key, $fields);
    }

    // 添加有序集合元素
    public function zAdd($key, $score, $member)
    {
        return $this->client->zAdd($key, $score, $member);
    }

    // 获取有序集合中的元素
    public function zRange($key, $start, $end, $withScores = false)
    {
        return $this->client->zRange($key, $start, $end, $withScores);
    }

    // 添加集合元素
    public function sAdd($key, ...$members)
    {
        return $this->client->sAdd($key, ...$members);
    }

    // 获取集合中的所有元素
    public function sMembers($key)
    {
        return $this->client->sMembers($key);
    }

    // 添加列表元素
    public function rPush($key, ...$values)
    {
        return $this->client->rPush($key, ...$values);
    }

    // 获取列表中的所有元素
    public function lRange($key, $start, $end)
    {
        return $this->client->lRange($key, $start, $end);
    }

    // 获取有序集合中的元素（按分数倒序）
    public function zRevRange($key, $start, $end)
    {
        return $this->client->zRevRange($key, $start, $end);
    }

    // 设置键的过期时间（以秒为单位）
    public function setExpiry($key, $seconds)
    {
        return $this->client->expire($key, $seconds);
    }

    // 设置键的过期时间（以毫秒为单位）
    public function psetExpiry($key, $milliseconds)
    {
        return $this->client->pexpire($key, $milliseconds);
    }

    // 断开连接
    public function disconnect()
    {
        $this->client->disconnect();
    }
}
